package com.dcy.daily.common.dataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import javax.sql.DataSource;
import java.util.Map;

/**
 * 根据用户定义的规则选择当前的数据源,这样我们可以在执行查询之前，设置使用的数据源。
 * 在每次数据库查询操作前执行，它的抽象方法 determineCurrentLookupKey() 决定使用哪个数据源。
 * 基于AbstractRoutingDataSource的多数据源动态切换，可以实现读写分离。
 * 这么做缺点也很明显，无法动态的增加数据源。
 * @author duanchunyu
 * @version 1.0.0
 * @createTime 2021年05月28日 14:59:00
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

    public static final Logger logger = LoggerFactory.getLogger(DynamicDataSource.class);

    private static final ThreadLocal<String> DATASOURCE_KEY = new ThreadLocal();

    public DynamicDataSource(DataSource defaultTargetDataSource,  Map<Object, Object> targetDataSources) {
        super.setDefaultTargetDataSource(defaultTargetDataSource);
        super.setTargetDataSources(targetDataSources);
        super.afterPropertiesSet();
    }

    @Override
    protected Object determineCurrentLookupKey() {
        return getDataSourceKey();
    }

    public static void setDataSourceKey(String dataSourceKey){
        logger.info("切换数据源到：{}" + dataSourceKey);
        DATASOURCE_KEY.set(dataSourceKey);
    }

    public static String getDataSourceKey(){
       return DATASOURCE_KEY.get();
    }

    public static void clearDataSourceKey(){
        DATASOURCE_KEY.remove();
    }
}
